##第10章：
##注意　要运行这个程序（以及后面的众多示例），你需要从http://www.ituring.com.cn/book/1861下载相关的资源。
##节使用的文本来自项目Gutenberg(http://gutenberg.org/)，
import pygame
print(pygame.__version__)


##
print('\n10-1:')
##10-1 Python学习笔记：在文本编辑器中新建一个文件，写几句话来总结一下你至此学到的Python知识，
##其中每一行都以“In Python you can”打头。将这个文件命名为learning_python.txt，并将其存储到为完成本章练习而编写的程序所在的目录中。
##编写一个程序，它读取这个文件，并将你所写的内容打印三次：第一次打印时读取整个文件；第二次打印时遍历文件对象；第三次打印时将各行存储在一个列表中，再在with代码块外打印它们。
print('\n读取整个文件:')
with open('learning_python.txt',encoding = 'utf-8') as file_obj:
    contents = file_obj.read()
    print(' -',contents)
print('\n遍历文件对象:')
with open('learning_python.txt',encoding = 'utf-8') as file_obj:
    for line in file_obj:
        print(' -',line.rstrip())
print('\n在with代码块外打印它们:')
with open('learning_python.txt',encoding = 'utf-8') as file_obj:
    lines = file_obj.readlines()
for line in lines:
    print(' -',line.rstrip())

print('\n10-2:')
##10-2 C语言学习笔记：可使用方法replace()将字符串中的特定单词都替换为另一个单词。下面是一个简单的示例，演示了如何将句子中的'dog'替换为'cat'：
##>>>message = "I really like dogs."￼ >>>message.replace('dog','cat')￼ 'I really like cats.'
##读取你刚创建的文件learning_python.txt中的每一行，将其中的Python都替换为另一门语言的名称，如C。将修改后的各行都打印到屏幕上。
with open('learning_python.txt',encoding = 'utf-8') as file_obj:
    lines = file_obj.readlines()
for line in lines:
    line = line.replace('Python','Java').rstrip()
    print(' -',line)

print('\n10-3:写文件')   
####10-3 访客：编写一个程序，提示用户输入其名字；用户作出响应后，将其名字写入到文件guest.txt中。
##with open('guest.txt',encoding='utf-8',mode = 'w') as file_obj:
##    print("请输入您的名字（输入 'q' 退出）：")
##    while True:
##        user_name = input('请输入你的名字:')
##        if user_name == 'q':
##            print("已退出程序，名字已保存到 guest.txt")
##            break
##
##        if user_name.strip():
##            file_obj.write(user_name + '\n')
##            print("已退出程序，名字已保存到 guest.txt")
##        else:
##            print('名字不能为空，请重新输入。')
##
##print('\n10-4:写文件：访客')  
####10-4 访客名单：编写一个while循环，提示用户输入其名字。用户输入其名字后，在屏幕上打印一句问候语，并将一条访问记录添加到文件guest_book.txt中。确保这个文件中的每条记录都独占一行。
##with open('guest_book.txt',encoding='utf-8',mode = 'a') as file_obj:
##    print("请输入您的名字（输入 'q' 退出）：")
##    while True:
##        user_name = input('请输入你的名字:')
##        if user_name == 'q':
##            print("已退出程序，访客名字已保存到 guest.txt")
##            break
##
##        if user_name.strip():
##            file_obj.write(user_name + '\n')
##            print("已退出程序，访客名字已保存到 guest.txt")
##        else:
##            print('访客名字不能为空，请重新输入。')

##print('\n10-5:写文件：喜欢编程原因')             
####10-5 关于编程的调查：编写一个while循环，询问用户为何喜欢编程。每当用户输入一个原因后，都将其添加到一个存储所有原因的文件中。
##with open('like_program_reson.txt',encoding='utf-8',mode = 'a') as file_obj:
##    print('请输入你喜欢 编程的原因(输入"q"退出)')
##    while True:
##        like_program_reson = input('原因是?:')
##        if like_program_reson.lower() == 'q':
##            print('退出程序,你输入的原因已追加到文件like_program_reson.txt中')
##            break
##        if like_program_reson.strip():
##            file_obj.write(like_program_reson + '\n')
##            print('你输入的原因已追加到文件like_program_reson.txt中')
##        else:
##            print('原因不能为空')

##print('\n10-6:加法运算')   
####10-6 加法运算：提示用户提供数值输入时，常出现的一个问题是，用户提供的是文本而不是数字。在这种情况下，当你尝试将输入转换为整数时，将引发ValueError异常。
####     编写一个程序，提示用户输入两个数字，再将它们相加并打印结果。在用户输入的任何一个值不是数字时都捕获ValueError异常，并打印一条友好的错误消息。
####            对你编写的程序进行测试：先输入两个数字，再输入一些文本而不是数字。
##print('请输入两个数据，我会计算它们的和输入到屏幕上')
##try:
##    while True:
##        num1 = input('请输入第1个数字:')
##        if num1.lower() == 'q':
##            print('程序退出')
##            break
##        num2 = input('请输入第2个数字:')
##        if num2.lower() == 'q':
##            print('程序退出')
##            break
##        sumN = float(num1)+ float(num2)
##        print('两个数字的和是',sumN)
##            
##except ValueError:
##    print('输入的不是数字! 请重新输入')
##
##print('\n10-7:加法运算2')   
####10-7 加法计算器：将你为完成练习10-6而编写的代码放在一个while循环中，让用户犯错（输入的是文本而不是数字）后能够继续输入数字。
##print('请输入两个数据，我会计算它们的和输入到屏幕上')
##while True:
##    try:
##        num1 = input('请输入第1个数字:')
##        if num1.lower() == 'q':
##            print('程序退出')
##            break
##        num2 = input('请输入第2个数字:')
##        if num2.lower() == 'q':
##            print('程序退出')
##            break
##        sumN = float(num1)+ float(num2)
##        print('两个数字的和是',sumN)
##        
##    except ValueError:
##        print('输入错误：请输入有效的数字（或输入 q 退出）')

print('\n10-8:FileNotFound')     
##10-8 猫和狗：创建两个文件cats.txt和dogs.txt，在第一个文件中至少存储三只猫的名字，在第二个文件中至少存储三条狗的名字。编写一个程序，尝试读取这些文件，并将其内容打印到屏幕上。
##将这些代码放在一个try-except代码块中，以便在文件不存在时捕获FileNotFound错误，并打印一条友好的消息。将其中一个文件移到另一个地方，并确认except代码块中的代码将正确地执行。
##try:
##    with open('cats.txt',encoding='utf-8') as file_obj:
##        cats = file_obj.readlines()
##    print(' -',cats)
##    with open('dogs.txt',encoding='utf-8') as file_obj:
##        dogs = file_obj.readlines()
##    print(' -',dogs)
##except FileNotFoundError:
##    print('错误: 文件不存在')

##print('\n10-9:pass')     
##10-9 沉默的猫和狗：修改你在练习10-8中编写的except代码块，让程序在文件不存在时一言不发。
try:
    with open('cats.txt',encoding='utf-8') as file_obj:
        cats = file_obj.readlines()
    print(' -',cats)
    with open('dogs.txt',encoding='utf-8') as file_obj:
        dogs = file_obj.readlines()
    print(' -',dogs)
except :
    print('发生异常了',e)

##print('\n10-10:分析文本')  
##10-10 常见单词：访问项目Gutenberg(http://gutenberg.org/)，并找一些你想分析的图书。下载这些作品的文本文件或将浏览器中的原始文本复制到文本文件中。
##你可以使用方法count()来确定特定的单词或短语在字符串中出现了多少次。例如，下面的代码计算'row'在一个字符串中出现了多少次：
##>>line = "Row,row,row your boat">>line.count('row')2￼ >>line.lower().count('row')3
##请注意，通过使用lower()将字符串转换为小写，可捕捉要查找的单词出现的所有次数，而不管其大小写格式如何。
##编写一个程序，它读取你在项目Gutenberg中获取的文件，并计算单词'the'在每个文件中分别出现了多少次。
def count_word_occurrences(filename,word = 'the'):
    try:
        with open(filename,encoding='utf-8') as file_obj:
            content = file_obj.read()
    except FileNotFoundError:
        print(f"错误：文件 '{filename}' 不存在。")
        return 0  # 文件不存在时返回0
    except Exception as e:
        print('发生异常了',e)
    else:
        countThe = content.lower().count(word)
    return countThe

books = [
'The Complete Works of William Shakespeare by William Shakespeare.txt',
'Wigwam wonder tales by Colonel William Thompson.txt'
    ]
for book in books:
    the_count = count_word_occurrences(book, 'the')
    print(f"在 '{book}' 中，'the' 出现了 {the_count} 次。")

print('\n10-11: json保存、读取')  
##10-11 喜欢的数字：编写一个程序，提示用户输入他喜欢的数字，并使用json.dump()将这个数字存储到文件中。再编写一个程序，从文件中读取这个值，并打印消息“I know your favorite number!It's _____.”。
##import json
##
##def save_num_json(filename):
##    with open(filename, mode = 'w', encoding='utf-8') as f:
##        while True:
##            num_input = input('请输入你喜欢的数字:')
##            if num_input.lower() == 'q':
##                break
##            try:
##                num = int(num_input)
##                json.dump(num,f)
##                break
##            except ValueError:
##               print('请输入有效的整数!')
##            
##def show_num_json(filename):
##    try:
##        with open(filename, encoding='utf-8') as f:
##            try:
##                nums = json.load(f)
##                print("I know your favorite number!It's", nums)
##            except Exception as e:
##                print('发生错误',e)   
##    except FileNotFoundError:
##        print('找不到存储的文件,请先保存数字')
##filename = 'favorite_number.json'
##save_num_json(filename)
##show_num_json(filename)


print('\n10-12: json保存、读取2') 
##10-12 记住喜欢的数字：将练习10-11中的两个程序合而为一。如果存储了用户喜欢的数字，就向用户显示它，否则提示用户输入他喜欢的数字并将其存储到文件中。运行这个程序两次，看看它是否像预期的那样工作。
import json
def save_or_show(filename):
    try:
        with open(filename,encoding = 'utf-8') as f:
            num = json.load(f)
            print("I know your favorite number!It's ", num)
    except Exception as e:
        num_input = input('请输入你喜欢的数字:')
        if num_input.strip() and num_input.isdigit():
            with open(filename, encoding = 'utf-8', mode = 'a') as f:
                json.dump(int(num_input),f)
        print("请输入有效的整数！")
    
filename = 'favorite_number.json'
save_or_show(filename)

##10-13 验证用户：最后一个remember_me.py版本假设用户要么已输入其用户名，要么是首次运行该程序。我们应修改这个程序，以应对这样的情形：当前和最后一次运行该程序的用户并非同一个人。
##为此，在greet_user()中打印欢迎用户回来的消息前，先询问他用户名是否是对的。如果不对，就调用get_new_username()让用户输入正确的用户名。
import remember_me
remember_me.greet_user()




















